:sparkles: Support qy_login_api

huangqimin001 5 years ago
parent
commit
42164961e3
6 changed files with 153 additions and 7 deletions
  1. 59 0
      account/migrations/0046_auto_20200601_0237.py
  2. 18 5
      account/models.py
  3. 0 1
      api/admin_views.py
  4. 3 1
      api/urls.py
  5. 3 0
      kodo/settings.py
  6. 70 0
      miniapp/qy_views.py

+ 59 - 0
account/migrations/0046_auto_20200601_0237.py

@@ -0,0 +1,59 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 1.11.29 on 2020-05-31 18:37
3
+from __future__ import unicode_literals
4
+
5
+from django.db import migrations, models
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('account', '0045_userinfo_new_subscribe'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.AddField(
16
+            model_name='userinfo',
17
+            name='is_maintenance',
18
+            field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u7ef4\u4fee\u5458', verbose_name='is_maintenance'),
19
+        ),
20
+        migrations.AddField(
21
+            model_name='userinfo',
22
+            name='userid',
23
+            field=models.CharField(blank=True, db_index=True, help_text='\u4f01\u4e1a\u5fae\u4fe1 userid', max_length=32, null=True, verbose_name='userid'),
24
+        ),
25
+        migrations.AlterField(
26
+            model_name='userinfo',
27
+            name='openid',
28
+            field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid'),
29
+        ),
30
+        migrations.AlterField(
31
+            model_name='userinfo',
32
+            name='openid_lensman',
33
+            field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_lensman'),
34
+        ),
35
+        migrations.AlterField(
36
+            model_name='userinfo',
37
+            name='openid_miniapp',
38
+            field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_miniapp'),
39
+        ),
40
+        migrations.AlterField(
41
+            model_name='userinfo',
42
+            name='openid_oauth',
43
+            field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_oauth'),
44
+        ),
45
+        migrations.AlterField(
46
+            model_name='userinfo',
47
+            name='openid_tourguide',
48
+            field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_tourguide'),
49
+        ),
50
+        migrations.AlterField(
51
+            model_name='userinfo',
52
+            name='user_from',
53
+            field=models.IntegerField(choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (22, '\u4f01\u4e1a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')], default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from'),
54
+        ),
55
+        migrations.AlterUniqueTogether(
56
+            name='userinfo',
57
+            unique_together=set([('appid', 'userid')]),
58
+        ),
59
+    ]

+ 18 - 5
account/models.py

@@ -256,6 +256,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
256 256
     LENSMAN_USER = 10
257 257
     TOURGUIDE_USER = 11
258 258
     MINIAPP_USER = 12
259
+    QYMINIAPP_USER = 22
259 260
     OAUTH_USER = 13
260 261
 
261 262
     USER_FROM = (
@@ -266,6 +267,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
266 267
         (LENSMAN_USER, u'摄影师端用户'),
267 268
         (TOURGUIDE_USER, u'导游端用户'),
268 269
         (MINIAPP_USER, u'小程序端用户'),
270
+        (QYMINIAPP_USER, u'企业微信小程序端用户'),
269 271
         (OAUTH_USER, u'网页授权用户'),
270 272
     )
271 273
 
@@ -317,11 +319,13 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
317 319
     # 微信授权用户
318 320
     appid = models.CharField(_(u'appid'), max_length=32, blank=True, null=True, help_text=u'appId', db_index=True)
319 321
     unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True)
320
-    openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True)
321
-    openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True)
322
-    openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True)
323
-    openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True)
324
-    openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True)
322
+    openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
323
+    openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
324
+    openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
325
+    openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
326
+    openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
327
+    # 企业微信授权用户
328
+    userid = models.CharField(_(u'userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 userid', db_index=True)
325 329
     # 用户基本信息
326 330
     name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名')
327 331
     sex = models.IntegerField(_(u'sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.UNKNOWN, help_text=u'用户性别')
@@ -373,10 +377,17 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
373 377
     shots_num = models.IntegerField(_(u'shots_num'), default=0, help_text=u'主持镜头数')
374 378
     level = models.IntegerField(_(u'level'), choices=LEVEL_TUPLE, default=MEMBER_NO, help_text=u'会员等级')
375 379
 
380
+    # 维修员信息
381
+    is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=_(u'是否维修员'), db_index=True)
382
+
376 383
     class Meta:
377 384
         verbose_name = _(u'userinfo')
378 385
         verbose_name_plural = _(u'userinfo')
379 386
 
387
+        unique_together = (
388
+            ('appid', 'userid'),
389
+        )
390
+
380 391
     def __unicode__(self):
381 392
         return unicode(self.pk)
382 393
 
@@ -462,6 +473,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
462 473
             'freeze_integral': self.freeze_integral,
463 474
             'shots_num': self.shots_num,
464 475
             'level': self.level,
476
+            # 维修员信息
477
+            'is_maintenance': self.is_maintenance,
465 478
         }
466 479
 
467 480
     @property

+ 0 - 1
api/admin_views.py

@@ -163,7 +163,6 @@ def query_usercoupons(request):
163 163
 
164 164
     coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
165 165
     coupons = [coupon.admindata for coupon in coupons]
166
-    print coupons
167 166
 
168 167
     return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
169 168
         'coupons': coupons,

+ 3 - 1
api/urls.py

@@ -13,7 +13,7 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui
13 13
                    tourguidegroupuser_views)
14 14
 from group import views as group_views
15 15
 from message import views as message_views
16
-from miniapp import views as mini_views
16
+from miniapp import views as mini_views, qy_views
17 17
 from operation import views as op_views
18 18
 from page import oauth_views, sale_views, screen_views
19 19
 from pay import views as pay_views
@@ -184,6 +184,8 @@ urlpatterns += [
184 184
     url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'),  # 获取用户信息
185 185
     url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'),  # 小程序登录
186 186
     url(r'^mini/userinfo2$', mini_views.get_userinfo_api2, name='get_userinfo_api2'),  # 获取用户信息
187
+
188
+    url(r'^qy/login$', qy_views.qy_login_api, name='qy_login_api'),  # 小程序登录
187 189
 ]
188 190
 
189 191
 urlpatterns += [

+ 3 - 0
kodo/settings.py

@@ -440,6 +440,9 @@ COMPONENT_CALLBACK_CONFIG = {
440 440
 # 测试文件
441 441
 TESTING_ZBAR = os.path.join(BASE_DIR, 'utils/zbar/zbar.jpg').replace('\\', '/')
442 442
 
443
+# QY
444
+QY_MAINTENANCE_USERID = []
445
+
443 446
 # 开发调试相关配置
444 447
 if DEBUG:
445 448
     try:

+ 70 - 0
miniapp/qy_views.py

@@ -0,0 +1,70 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import logging
4
+
5
+from django.conf import settings
6
+from django.db import transaction
7
+from django_curtail_uuid import CurtailUUID
8
+from django_logit import logit
9
+from django_response import response
10
+from ipaddr import client_ip
11
+from pyqywe_miniapp import get_userid
12
+from pywe_storage import RedisStorage
13
+from TimeConvert import TimeConvert as tc
14
+
15
+from account.models import UserInfo
16
+from statistic.models import RegisterStatisticInfo
17
+from utils.error.errno_utils import ProductBrandStatusCode
18
+from utils.redis.connect import r
19
+from utils.redis.rprofile import set_profile_info
20
+
21
+
22
+WECHAT = settings.WECHAT
23
+logger = logging.getLogger('logit')
24
+
25
+
26
+@logit(res=True)
27
+@transaction.atomic
28
+def qy_login_api(request):
29
+    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
30
+    appId = request.POST.get('appId', 'QYMINIAPP')
31
+
32
+    if brand_id != settings.KODO_DEFAULT_BRAND_ID:
33
+        return response(ProductBrandStatusCode.BRAND_NOT_MATCH)
34
+
35
+    wxcfg = WECHAT.get(appId, {})
36
+
37
+    appid = wxcfg.get('appID')
38
+    secret = wxcfg.get('appsecret')
39
+
40
+    code = request.POST.get('code', '')
41
+
42
+    userid = get_userid(appid=appid, secret=secret, code=code, storage=RedisStorage(r))
43
+
44
+    # Get or Create User
45
+    user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid)
46
+
47
+    # Set User_id
48
+    if created:
49
+        user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')
50
+        # 注册用户统计
51
+        rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create(
52
+            brand_id=brand_id,
53
+            ymd=int(tc.local_string(format='%Y%m%d')),
54
+        )
55
+        rsi.num += 1
56
+        rsi.save()
57
+
58
+    # Set User Key's Value
59
+    user.user_from = UserInfo.QYMINIAPP_USER
60
+    user.appid = appid
61
+    user.user_status = UserInfo.ACTIVATED
62
+    user.signup_ip = client_ip(request)
63
+    user.signup_at = tc.utc_datetime()
64
+    user.is_maintenance = userid in settings.QY_MAINTENANCE_USERID
65
+    user.save()
66
+
67
+    # Store Userinfo
68
+    set_profile_info(user)
69
+
70
+    return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id))